home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 3 / Cream of the Crop 3.iso / utility / sfs100.zip / SFS3.DOC < prev    next >
Text File  |  1994-02-20  |  58KB  |  1,263 lines

  1. SFS Disk Volume Layout
  2. ----------------------
  3.  
  4. An SFS volume is broken up into two parts, the boot sector which is used to
  5. identify the volume and store assorted status information, and the encrypted
  6. volume itself.  If a program tries to read the boot sector, the SFS driver will
  7. assemble a pseudo-boot sector in memory and return that instead.  If a program
  8. tries to write to the boot sector, the SFS driver will skip the boot sector
  9. while still writing any other sectors which may be requested.
  10.  
  11. All data on the boot sector, both plaintext and encrypted, is stored in
  12. big-endian format following the convention used by international cryptographic
  13. standards.  Care should to taken to ensure that the proper endianness is
  14. maintained when reading and writing the boot sector on little-endian systems
  15. (the performance of the current implementation was tested against the RS6000
  16. version to confirm that endianness conversion was being done correctly).
  17.  
  18. In the following discussion a BYTE is an 8-bit quantity, a WORD is a big-
  19. endian 16-bit quantity, and a LONG is a big-endian 32-bit quantity.  There are
  20. no alignment restrictions for the data as stored on disk.  All data is
  21. close-packed with no need for byte-padding for word or longword boundaries.
  22.  
  23.  
  24. The SFS Volume Header Record
  25.  
  26. The boot record is the first sector in a disk volume, and is usually used to
  27. load a bootstrap code block which loads more code which eventually loads DOS or
  28. an operating system.  In the case of SFS there is no bootstrap code as SFS
  29. partitions are not bootable.  Instead, the boot record contains a volume header
  30. record holding identification information which SFS uses when mounting the
  31. volume, and encryption information to allow SFS to decrypt the volume.  The
  32. information is stored as a series of variable-length data packets with fields
  33. in big-endian order.  Although it might be desirable to store the data as
  34. DER-encoded ASN.1 (ISO 8824, ISO 8825), the amount of code necessary to decode
  35. this information is considerable, leading to excessively complicated loaders
  36. for the encrypted volume.  In particular, it would make the use of automatic
  37. volume mounts for the SFS device driver virtually impossible.
  38.  
  39. The SFS volume header may contain multiple data packets, currently up to four
  40. types are implemented (there is an additional fifth pseudo-packet type which is
  41. a null data packet).  One packet identifies the volume, one contains encryption
  42. information needed to en/decrypt the volume, and one contains
  43. filesystem-specific information needed to access the volume.  These packets are
  44. mandatory.  Finally, an optional packet may be used to hold information for
  45. volumes accessible by multiple users.  Each packet consists of a packet type
  46. identifier followed by the length of the data in the packet, and then by the
  47. packet data itself.
  48.  
  49. The volume header is laid out as follows:
  50.  
  51.     Offset  Size    Type        Description
  52.  
  53.        0      4     BYTE[ 4 ]   'SFS1' identification string
  54.        4      2     WORD        Information packet 1 ID
  55.        6      2     WORD        Information packet 1 data length
  56.        8     ??     ????        Information packet 1 data
  57.        n      2     WORD        Information packet 2 ID
  58.      n+2      2     WORD        Information packet 2 data length
  59.      n+4     ??     ????        Information packet 2 data
  60.                       ..........
  61.        m      2     WORD        Information packet n ID
  62.      m+2      2     WORD        Information packet n data length
  63.      m+4     ??     ????        Information packet n data
  64.  
  65. It is recommended that the order of the information packets be as follows
  66.  
  67.     1.  Volume information
  68.     2.  Encryption information
  69.     3.  Filesystem information
  70.     4.  Other information (such as multiuser access data)
  71.  
  72. although this is not essential.  However some volume automount software which
  73. must run with severely limited resources may run into problems if the order of
  74. the data packets is not as expected.  The remainder of the sector is filled
  75. with zeroes.  Currently defined packet types are:
  76.  
  77.     Name                    Value       Information type
  78.  
  79.     SFS_PACKET_NONE           0         Null packet
  80.     SFS_PACKET_VOLUMEINFO     1         Volume information
  81.     SFS_PACKET_ENCRINFO       2         Encryption information
  82.     SFS_PACKET_DISK_BPB       3         Filesystem information
  83.     SFS_PACKET_MULTIUSER      4         Multiuser access information
  84.  
  85.  
  86. Packet 0 - Null Packet
  87.  
  88. This packet contains no information and is never explicitly set in an SFS
  89. volume header.  However since the remainder of the header after the actual data
  90. is padded out with zeroes, it can be viewed as containing a succession of null
  91. packets.
  92.  
  93.  
  94. Packet 1 - Volume Information Packet
  95.  
  96. The volume information packet contains the volume name, the volume creation
  97. time, and the volume serial number.  The packet layout is as follows:
  98.  
  99.     Offset  Size    Type        Description
  100.  
  101.        0      2     WORD        Volume information packet ID = 1
  102.        2      2     WORD        Volume information packet data length
  103.        4      2     WORD        Volume name character set identifier
  104.        6      2     WORD        Volume name length
  105.        8     ??     BYTE[]      Volume name
  106.        n      4     LONG        Volume date, stored as seconds since 1970 GMT
  107.      n+4      4     LONG        Volume serial number
  108.  
  109. The character set identifier is one of the following:
  110.  
  111.     Value   Type
  112.  
  113.       0     ISO 646 character set
  114.       1     ISO 8859-1 character set
  115.       2     ISO 8859-2 charcater set
  116.       3     ISO 8859-3 character set
  117.       4     ISO 8859-4 character set
  118.       5     ISO 8859-5 character set
  119.       6     ISO 8859-6 character set
  120.       7     ISO 8859-7 character set
  121.       8     ISO 8859-8 character set
  122.       9     ISO 8859-9 character set
  123.      ??     Reserved for future use
  124.  
  125. The volume name is stored as an octet string immediately following the
  126. character set and length values.  The recommended maximum length for the volume
  127. name field is 100 octets, in order to allow room for the remainder of the
  128. volume header.
  129.  
  130. The volume creation data is stored as a count of seconds since midnight on 1st
  131. January 1970.  Times are stored relative to GMT, although some operating
  132. systems may have trouble with time zones.
  133.  
  134. The volume serial number is used mainly for identification purposes and has no
  135. special characteristics, but should be unique across volumes.
  136.  
  137.  
  138. Packet 2 - Encryption Information Packet
  139.  
  140. The encryption information packet contains the algorithm identifier of the
  141. encryption algorithm being used, the iteration count used when setting up the
  142. keying information, the initialisation vector (IV) for the disk key, the
  143. encrypted disk key for the volume, and a key check value which may be used to
  144. verify that the correct decryption key has been given. The packet layout is as
  145. follows:
  146.  
  147.     Offset  Size    Type        Description
  148.  
  149.        0      2     WORD        Encryption packet ID = 2
  150.        2      2     WORD        Encryption packet data length
  151.        4      2     WORD        Encryption algorithm identifier
  152.        6      2     WORD        Encryption key setup iteration count
  153.        8     ??     BYTE[]      Disk key IV
  154.        n    128     BYTE[]      Encrypted disk key
  155.    n+128      2     WORD        Key check value
  156.  
  157. The encryption algorithm identifier is one of the following:
  158.  
  159.     Value   Type
  160.       0     MDC/SHS
  161.      ??     Reserved for future use
  162.  
  163. The MDC/SHS algorithm uses the Secure Hash Standard as the block transformation
  164. in the MDC encryption algorithm.
  165.  
  166. The size of the disk key IV depends on the encryption algorithm, and is equal
  167. to the block size of the encryption algorithm being used.  In the case of
  168. MDC/SHS this is 160 bits or 20 bytes.
  169.  
  170. The encrypted disk key contains 128 bytes of cryptographically strong random
  171. information whose derivation is given in the section "Generating Random
  172. Numbers" above.  This data may be utilized as required by the encryption
  173. algorithm used for the particular disk volume.  In the case of MDC/SHS the
  174. first 160 bits are used as the master disk IV from which individual sector IV's
  175. are generated as described in the section "The Use of an Initialization
  176. Vector", the next 512 bits are used as the en/decryption key, and the remaining
  177. 352 bits are ignored.  Other algorithms with larger or smaller key spaces may
  178. use this data differently.
  179.  
  180. The key check value is provided to give some warning about an incorrect
  181. password, and should be derived from the encryption key in some nontrivial
  182. manner which makes using the key check in an attack no easier than a standard
  183. known plaintext attack.  In the case of MDC/SHS it is the last two octets in
  184. the key data buffer after the key setup operation has been performed (this
  185. value is never used as part of the encryption key, and is the product of 200
  186. iterations of MDC/SHS over the user key).
  187.  
  188.  
  189. Packet 3 - Filesystem Information Packet
  190.  
  191. The filesystem information packet contains identification information for the
  192. filesystem contained on the encrypted volume followed by encrypted
  193. filesystem-specific information needed to handle the volume.  This information
  194. is highly system-specific.  The packet layout is as follows:
  195.  
  196.     Offset  Size    Type        Description
  197.  
  198.        0      2     WORD        Filesystem information packet ID = 3
  199.        2      2     WORD        Filesystem information packet data length
  200.        4      2     WORD        Filesystem type identifier
  201.        6     ??     BYTE[]      Encrypted filesystem information
  202.  
  203. The filesystem type identifier is one of the following:
  204.  
  205.     Value   Type
  206.  
  207.       0     MSDOS FAT filesystem - BPB data
  208.      ??     Reserved for future use
  209.  
  210. The encrypted MSDOS BPB data record corresponds directly to a standard BIOS
  211. parameter block and is laid out as follows:
  212.  
  213.     Offset  Size    Type        Description
  214.  
  215.        0      2     WORD        Sector size in bytes
  216.        2      1     BYTE        Sectors per cluster
  217.        3      2     WORD        Number of boot sectors
  218.        5      1     BYTE        Number of FAT copies
  219.        6      2     WORD        Number of entries in root directory
  220.        8      2     WORD        16-bit number of sectors on disk
  221.       10      1     BYTE        Media descriptor byte
  222.       11      2     WORD        Number of sectors per FAT
  223.       13      2     WORD        Number of sectors per track
  224.       15      2     WORD        Number of heads
  225.       17      4     LONG        Number of hidden sectors
  226.       21      4     LONG        32-bit number of sectors on disk
  227.  
  228.  
  229. Packet 4 - Multiuser Access Information
  230.  
  231. The multiuser access information packet contains an identification number for
  232. the multiuser access data file needed to access the volume.  This value is
  233. checked against an equivalent one in the access data file to ensure that the
  234. data file corresponds to the volume in question.  In addition the presence of
  235. this packet signals to the user software that the volume has multiuser access
  236. enabled.  The packet layout is as follows:
  237.  
  238.     Offset  Size    Type        Description
  239.  
  240.        0      2     WORD        Multiuser access information packet ID = 4
  241.        2      2     WORD        Multiuser access information packet data length
  242.        4      4     LONG        Multiuser access data file ID
  243.  
  244.  
  245. SFS Multiuser Access File Layout
  246. --------------------------------
  247.  
  248. [The following information is preliminary and is bound to change at a moments
  249.  notice]
  250.  
  251. Associated with each SFS volume which has multiuser access enabled are one or
  252. more database files containing information on each user who has access to that
  253. volume.  This consists of identification information for each user (in the case
  254. of a named database), access control information, and keying information needed
  255. to access the actual volume.
  256.  
  257. The file is laid out as a simple flat database, which is adequate for its
  258. intended use since a user record is only retrieved once per database access,
  259. and generally the databases will be quite small.
  260.  
  261. On a system with proper access control this file will be read-only for everyone
  262. but the volume administrator, but unfortunately under some operating systems
  263. and also DOS there is little access control and anyone with access to a sector
  264. editor can change their access rights.  However at this level they can also
  265. change the SFS volume header and the behaviour of mountsfs and the SFS driver,
  266. so little is gained by attempting to plug this hole.  In any case, the basic
  267. access to the volume is cryptographically controlled, and bypassing this goes
  268. beyond simply editing a file.
  269.  
  270. In the future it may worthwhile implementing more heavy-duty controls, such as
  271. using public-key signed access permission tokens from the volume administrator
  272. to grant access for networked use.
  273.  
  274. All data in the multiuser access database is stored in big-endian format
  275. following the convention used by international cryptographic standards.  Care
  276. should to taken to ensure that the proper endianness is maintained when reading
  277. and writing the boot sector on little-endian systems (the performance of the
  278. current implementation was tested against the RS6000 version to confirm that
  279. endianness conversion was being done correctly).
  280.  
  281. In the following discussion a BYTE is an 8-bit quantity, a WORD is a big-
  282. endian 16-bit quantity, and a LONG is a big-endian 32-bit quantity.  There are
  283. no alignment restrictions for the data as stored in the database.  All data is
  284. close-packed with no need for byte-padding for word or longword boundaries.
  285.  
  286. An access database is broken up into two sections, a header record containing
  287. details on the database as a whole, and one or more individual user records.
  288.  
  289.  
  290. Database Header
  291.  
  292. The database header is laid out as follows:
  293.  
  294.     Offset  Size    Type        Description
  295.  
  296.        0      4     BYTE[4]     'SFS1' identification string
  297.        4      2     WORD        Database type identifier
  298.        6      4     LONG        Encrypted volume serial number
  299.       10      2     WORD        Number of user records in database
  300.       12      2     WORD        Database name character set identifier
  301.       14      2     WORD        Database name length
  302.       16     ??     BYTE[]      Database name
  303.  
  304. The identification string and database type identifier serve to identify the
  305. general database format.  The type identifier is one of the following:
  306.  
  307.     Value   Type
  308.  
  309.       0     Anonymous database containing date, access, keyinfo records
  310.       1     Named database containing user name, date, access, keyinfo records
  311.      ??     Reserved for future use
  312.  
  313. An anonymous database contains no identification for any of the user records.
  314. Each keyinfo record is decrypted in turn until a valid record is found, and
  315. this keying information is then used to access the encrypted volume.
  316.  
  317. A named database contains an idetifier for each user record.  Lookup of the
  318. database is performed directly by user name, and then access proceeds as for
  319. the anonymous database.
  320.  
  321. The encrypted volume serial number is the serial number of the volume this
  322. database is used to access.
  323.  
  324. [Problem: Should be able to set to zero to keep corresponding volume anonymous]
  325. [Problem: Can lead to trouble if chsfs is used to change volume serial number.
  326.           Perhaps change chsfs to disallow serial number change without also
  327.           changing database serial number]
  328.  
  329. The database name is the collective name for the database and the users in it.
  330. Example database names might be "Ancient Illuminated Seers of Bavaria" or
  331. "Trilateral Commission".  The name is optional, and may be omitted by
  332. specifying a name with a length of 0 characters.
  333.  
  334.  
  335. Database Records
  336.  
  337. Each record in the database is laid out as follows:
  338.  
  339.     Offset  Size    Type        Description
  340.  
  341.        0      2     WORD        Record type identifier
  342.        2      2     WORD        User name character set identifier
  343.        4      2     WORD        User name length
  344.        6     ??     BYTE[]      User name
  345.        n      4     LONG        Access valid from date
  346.      n+4      4     LONG        Access valid to date
  347.      n+8      4     LONG        Access rights bitstring
  348.     n+12     ??     BYTE[]      Keying information
  349.  
  350. The record type identifier is one of the following:
  351.  
  352.     Value   Type
  353.  
  354.       0     Anonymous record containing date, access, and keyinfo
  355.       1     Named record containing user name, date, access, and keyinfo
  356.      ??     Reserved for future use
  357.  
  358. The user name is the name of the user entitled to access the SFS volume the
  359. database corresponds to.  Under multiuser operating systems this will simply
  360. correspond to the userID which the user is known to the operating system under.
  361. Otherwise, the userID can be the users name or some similar identifying method
  362. capable of distinguishing users.  If the record type is an anonymous record,
  363. the user name fields will not be present.
  364.  
  365. [Problem: One user with many accounts.  Allow multiple userID's per record?
  366.           This could encourage password sharing though]
  367.  
  368. The access valid date pair contains the date after which access to the SFS
  369. volume is permitted, and the date at which access rights to the volume expire.
  370. These are stored in the Unix seconds-since-1970 format.
  371.  
  372. The access rights bitstring contains the access rights the user has to the SFS
  373. volume.
  374.  
  375. [Problem: How?  Use RWXRWXRWX?  Or ASN.1-type strings with complex FTAM-type
  376.           rights?  ACL's?]
  377.  
  378. The keying information is [what?  Same as single-user keying information]
  379.  
  380.  
  381. Interfacing with SFS
  382. --------------------
  383.  
  384. The SFS device driver has a sophisticated control interface which allows
  385. complete configurability through the standard DOS IOCTL read and write calls,
  386. which are used to transfer data to and from the control channel of a device.
  387. It is recommended that you consult a system programming guide or your compilers
  388. documentation for more information on making DOS IOCTL calls.  Many compilers
  389. provide standard routines for making these calls.
  390.  
  391. In the following discussion a BYTE is an 8-bit quantity, a WORD is a little-
  392. endian 16-bit quantity, and a LONG is a little-endian 32-bit quantity.  Note
  393. that these values will need endianness conversion after being read from the SFS
  394. volume header.
  395.  
  396.  
  397. How SFS Identifies Drives
  398.  
  399. For floppy disk drives, a value of 0 usually corresponds to drive A: and a
  400. value of 1 usually corresponds to drive B:.  For fixed disk drives a value of 0
  401. with the high bit set (giving an actual value of 0x80) usually corresponds to
  402. the first physical drive and a value of 1 with the high bit set (giving an
  403. actual value of 0x81) usually corresponds to the second physical drive.  These
  404. values correspond to physical drives and not logical volumes.  A single
  405. physical drive may contain a number of logical volumes.  Since the SFS driver
  406. runs below the level at which most operating systems operate, it will ignore
  407. the DOS drive mappings (in fact DOS can't even see the encrypted disk volume)
  408. and access the drive directly.  Thus if there are more than the DOS standard of
  409. two floppy drives and two physical hard drives connected to the system it
  410. should still be able to access the drives and present them to the operating
  411. system as normal disk volumes.
  412.  
  413. If the physical drive contains more than one logical volume, the offset of the
  414. start of the logical volume from the start of the physical drive is specified
  415. as a sector count.  If the physical drive contains only one logical volume,
  416. this value is set to zero.  Finding the start of the logical volume will
  417. usually entail parsing the partition table of the physical drive.  Floppy
  418. drives have only one logical volume which is equivalent in size to the physical
  419. drive, fixed disks have one or more logical volumes on each physical volume.
  420. These logical volumes can contain different filesystems and operating systems,
  421. and not all may be accessible or visible to DOS.  For more information on disk
  422. organization, refer to a good technical reference which covers disk drives, and
  423. then spend several days figuring out all the DOS quirks never mentioned in any
  424. reference.
  425.  
  426. In the following text the term `physical volume' is used to refer to the
  427. physical drive being accessed and the term `logical volume' is used to refer to
  428. the drive as DOS sees it.
  429.  
  430.  
  431. Reading from the SFS Driver:
  432.  
  433. The SFS driver processes both control channel read and control channel write
  434. requests.  Initially, the drive number of the logical volume being used by the
  435. SFS driver must be found.  This can be done by checking each possible logical
  436. drive as follows:
  437.  
  438.     for( driveNumber = 0; driveNumber <= 'Z' - 'A'; driveNumber++ )
  439.         {
  440.         /* Try and read data from the device's control channel */
  441.         data <- ioctlRead( driveNumber );
  442.  
  443.         /* Check for the SFS identification string */
  444.         if( first 4 bytes of data = 'SFS1' )
  445.             exit loop;
  446.         }
  447.  
  448. If, at the end of the loop's execution, the driveNumber is greater than the
  449. total number of drives in the system, the SFS driver has not been found,
  450. probably because it isn't present in the system.  Otherwise, driveNumber
  451. contains the drive number of the logical volume which the SFS driver is making
  452. available, and the data packet contains assorted status information about the
  453. SFS volume corresponding to the driverNumber.
  454.  
  455. The data packet returned by the SFS driver is as follows:
  456.  
  457.     Offset  Size    Type        Description
  458.  
  459.        0      4     BYTE[ 4 ]   'SFS1' identification string
  460.        4      2     WORD        SFS unit number, starting from 0
  461.        6      2     WORD        Physical drive the SFS volume is mounted on
  462.        8      4     LONG        Sector offset of logical volume from start of
  463.                                 physical volume, or 0 if logical volume corres-
  464.                                 ponds to physical volume
  465.       12      2     WORD        0 = no disk mounted, 1 = disk mounted
  466.       14      2     WORD        0 = disk is read/write, 1 = disk is read-only
  467.       16      2     WORD        Quick-unmount hotkey value (high byte = shift
  468.                                 value, low byte = optional keyboard scan code)
  469.       18      2     WORD        Auto-unmount time.  -1 = no unmount timer set,
  470.                                 0 = timer set but expired, any other value =
  471.                                 total unmount time in minutes
  472.       20      2     WORD        Auto-unmount timeout actual minutes remaining
  473.                                 before the unmount takes place
  474.       22      2     WORD        Internal driver check code.  0 = no error, 1 =
  475.                                 driver consistency check failed, 2 = individual
  476.                                 unit consistency check failed.
  477.  
  478. The unit number is used by SFS to handle multiple encrypted drives.  This value
  479. starts at zero for the first unit, and identifies the volume being accessed.
  480.  
  481. If queried via an IOCTL call on the volume's removability, the SFS driver will
  482. always indicate that the media is removable, even if the volume is on a fixed
  483. disk.  This is because some disk cacheing software won't invalidate a drive's
  484. data, even if the driver signals that the media has changed, unless the volume
  485. is marked as being removable.
  486.  
  487. This status information can be returned to the user in the form of a status
  488. message or an information dialog if desired (the physical drive and offset
  489. information can be used to read the volume name, date, and serial number from
  490. the encrypted volume).
  491.  
  492.  
  493. Writing to the SFS Driver
  494.  
  495. Once the driver has been found, several types of data packet can be sent to the
  496. driver to control its operation.  Each control packet begins with a WORD
  497. containing the magic value 'C0' which the SFS driver checks to ensure the
  498. packet is meant for it, and a WORD identifying the data packet type.  The data
  499. packet types are:
  500.  
  501.     Name                    Value       Information type
  502.  
  503.     PACKET_SET_DISKINFO       0         Disk parameters
  504.     PACKET_SET_KEYINFO        1         Keying information
  505.     PACKET_SET_READONLY       2         Set disk read-only status
  506.     PACKET_SET_DRIVENO        3         Physical drive number to mount
  507.     PACKET_SET_MOUNTSTATUS    4         Set mount status
  508.     PACKET_SET_UNMOUNT        5         Set/clear quick-unmount hotkey value
  509.     PACKET_SET_TIMEOUT        6         Set/clear timed unmount value
  510.  
  511. These packets are explained in more detail below.  All other values are
  512. reserved for future use.
  513.  
  514.  
  515. Packet 0 - Disk Parameters:
  516.  
  517. This packet type is used to convey to the SFS driver various pieces of
  518. information about the physical characteristics of the disk drive, including the
  519. sector size, number of heads, total number of sectors, and so on.  The packet
  520. layout is as follows:
  521.  
  522.     Offset  Size    Type        Description
  523.  
  524.        0      2     WORD        Magic value 'C0'
  525.        2      2     WORD        Packet type 0
  526.        4      2     WORD        Sector size in bytes
  527.        6      1     BYTE        Sectors per cluster
  528.        7      2     WORD        Number of boot sectors
  529.        9      1     BYTE        Number of FAT copies
  530.       10      2     WORD        Number of entries in root dir
  531.       12      2     WORD        Number of sectors on disk
  532.       14      1     BYTE        Media descriptor byte
  533.       15      2     WORD        Number of sectors per FAT
  534.       17      2     WORD        Number of sectors per track
  535.       19      2     WORD        Number of heads
  536.       21      4     LONG        Number of hidden sectors
  537.       25      4     LONG        Number of sectors per disk, 32-bit
  538.  
  539. Sending this data packet to the driver automatically unmounts the encrypted
  540. volume.
  541.  
  542.  
  543. Packet 1 - Keying information
  544.  
  545. This packet type sets up the encryption information in the driver.  It contains
  546. the en/decryption key, and the master IV for the encrypted volume.  The packet
  547. layout is as follows:
  548.  
  549.     Offset  Size    Type        Description
  550.  
  551.        0      2     WORD        Magic value 'C0'
  552.        2      2     WORD        Packet type 1
  553.        4     20     BYTE[ 20 ]  Master IV for encrypted volume
  554.       24     64     BYTE[ 64 ]  MDC/SHS keying information
  555.  
  556. Sending this data packet to the driver automatically unmounts the encrypted
  557. volume.
  558.  
  559.  
  560. Packet 2 - Set disk Read-only Status
  561.  
  562. This packet type sets the read-only status of the disk.  Sending a value of 0
  563. makes the disk read-only.  Sending a value of 1 makes the disk read/write.  The
  564. packet layout is as follows:
  565.  
  566.     Offset  Size    Type        Description
  567.  
  568.        0      2     WORD        Magic value 'C0'
  569.        2      2     WORD        Packet type 2
  570.        4      2     WORD        Read-only status: 0 = read-only, 1 = read/write
  571.  
  572. Sending this packet type has no effect on the mount status of the volume.
  573.  
  574.  
  575. Packet 3 - Physical Drive Number to Mount
  576.  
  577. This packet type sets the physical drive number and the offset of the logical
  578. volume on the physical drive, which the driver will en/decrypt.  The packet
  579. layout is as follows:
  580.  
  581.     Offset  Size    Type        Description
  582.  
  583.        0      2     WORD        Magic value 'C0'
  584.        2      2     WORD        Packet type 3
  585.        4      2     WORD        Physical drive number (see text above)
  586.        6      4     LONG        Sector offset of logical volume from start of
  587.                                 physical volume, or 0 if logical volume corres-
  588.                                 ponds to physical volume
  589.  
  590. Sending this data packet to the driver automatically unmounts the encrypted
  591. volume.
  592.  
  593.  
  594. Packet 4 - Set mount Status
  595.  
  596. This packet type sets the mount status of the drive.  A value of 0 unmounts the
  597. drive, a value of 1 mounts the drive.  The packet layout is as follows:
  598.  
  599.     Offset  Size    Type        Description
  600.  
  601.        0      2     WORD        Magic value 'C0'
  602.        2      2     WORD        Packet type 4
  603.        4      2     WORD        Mount status (0 = unmount, 1 = mount)
  604.  
  605. Unmounting the drive using this packet type also destroys the encryption
  606. information held by the driver and forces all data still held in cache and disk
  607. buffers to be flushed to disk.  This is the only sure way to erase all the
  608. encryption information, as it wipes not only the actual keying information but
  609. also most of the data area used by the driver and any data in cache and disk
  610. buffers.  Merely sending an empty keying information packet will not perform
  611. this task.
  612.  
  613.  
  614. Packet 5 - Set/clear Quick-Unmount Hotkey Value
  615.  
  616. This packet is used to set the hotkey value which the SFS driver checks for to
  617. quickly unmount an SFS volume, or to clear the hotkey handling.  The packet
  618. layout is as follows:
  619.  
  620.     Offset  Size    Type        Description
  621.  
  622.        0      2     WORD        Magic value 'C0'
  623.        2      2     WORD        Packet type 5
  624.        4      2     WORD        Hotkey value (see below)
  625.  
  626. The hotkey which the driver checks for can be any combination of the alt key,
  627. control key, left shift, and right shift (referred to as the shift code), and
  628. an arbitrary keyboard scan code.  The recommended default value is a
  629. combination of the left and right shift keys.  This information is encoded in
  630. the hotkey WORD as follows:
  631.  
  632.   The high 8 bits contain the shift code.  This contains a set of bitflags
  633.   which specify the shift keys the driver checks for, possibly in addition to
  634.   an optional character code.  The values are:
  635.  
  636.         Shift key       Value (binary)      Value (hex)
  637.  
  638.            Alt             00001000             08
  639.          Control           00000100             04
  640.        Left Shift          00000010             02
  641.       Right Shift          00000001             01
  642.  
  643.   The encoding for the shift code portion of the default left+right shift
  644.   hotkey is therefore 00000011 binary or 03 hex.
  645.  
  646.   The low 8 bits contain an optional keyboard scan code which the driver will
  647.   check for in addition to the shift code.  This value is used in combination
  648.   with the shift code to specify a key combination to the driver, so that for
  649.   example Alt-Z would be used as the quick-unmount hotkey, although care should
  650.   be taken to ensure that none of a large number of existing special key
  651.   combinations is reused for this).
  652.  
  653.   If the low 8 bits contain zeroes, the driver does not check for a keyboard
  654.   scan code in addition to a shift code.  The encoding for the keyboard scan
  655.   code portion of the default left+right shift hotkey is therefore 00000000
  656.   binary or 00 hex.
  657.  
  658.   The overall value is the combination of the shift code and keyboard scan
  659.   code, or 0300 hex for the default hotkey.
  660.  
  661. Specifying a value of 0 in this word will disable hotkey checking in the
  662. driver.
  663.  
  664. The hotkey quick-unmount is handled by hooking the int 9h keyboard interrupt.
  665. The interrupt handler which performs this task is installed either when the
  666. driver is loaded (if there is a volume to be automounted or a hotkey code is
  667. specified), or when mountsfs is run (which transmits a quick-unmount control
  668. packet to the driver).  The interrupt handler checks for the programmed hotkey
  669. and unmounts the volume if it is detected.  Subsequent quick-unmount control
  670. packets can be sent to the driver to change the actual hotkey value.  Sending a
  671. value of 0 will disable hotkey checking and deinstall the keyboard interrupt
  672. handler.
  673.  
  674.  
  675. Packet 6 - Set/clear Timed Unmount Value
  676.  
  677. This packet is used to set the unmount time after which the SFS volume is
  678. unmounted if no accesses are made to it.  The packet layout is as follows:
  679.  
  680.     Offset  Size    Type        Description
  681.  
  682.        0      2     WORD        Magic value 'C0'
  683.        2      2     WORD        Packet type 5
  684.        4      2     WORD        Timeout value in minutes before unmount
  685.                                 takes place
  686.  
  687. Specifying a value of 0 as the timeout value will disable the timed unmount
  688. feature in the driver.
  689.  
  690. The timed unmount is handled by hooking the int 1Ch timer interrupt.  The
  691. interrupt handler which performs this task is installed either when the driver
  692. is loaded (if a timeout value is specified at this time), or when mountsfs is
  693. run and a timeout value is specified (which transmits a timed unmount control
  694. packet to the driver).  The interrupt handler decrements the timer and unmounts
  695. the volume if it expires.  The timer is reset every time a media check packet
  696. is received by the driver, which allows normal DOS accesses to be detected but
  697. doesn't cause false triggering due to device driver control functions.
  698. Subsequent timed unmount control packets can be sent to the driver to change
  699. the actual timeout value.  Sending a value of 0 will disable the timer and
  700. deinstall the timer interrupt handler.
  701.  
  702.  
  703. Controlling the Driver
  704.  
  705. The SFS driver is initialized by sending it a series of control packets giving
  706. the disk information, the keying information, the physical drive and logical
  707. volume offset to access, the read/write status, and finally the mount command.
  708. The sequence of operations for mounting a volume is as follows:
  709.  
  710.     driveNumber <- find SFS drive number as outlined above;
  711.     ioctlWrite( driveNumber, PACKET_SET_DISKINFO, \
  712.                 disk information - packet type 0 );
  713.     ioctlWrite( driveNumber, PACKET_SET_KEYINFO, \
  714.                 keying information - packet type 1 );
  715.     ioctlWrite( driveNumber, PACKET_SET_READONLY, \
  716.                 drive to mount and vol.offs - packet type 3 );
  717.     ioctlWrite( driveNumber, PACKET_SET_DRIVENO, \
  718.                 read-only status - packet type 2 );
  719.     ioctlWrite( driveNumber, PACKET_SET_MOUNTSTATUS, \
  720.                 mount status TRUE - packet type 4 );
  721.  
  722. To mount a new volume on the same drive:
  723.  
  724.     driveNumber <- find SFS drive number as outlined above;
  725.     ioctlWrite( driveNumber, PACKET_SET_KEYINFO, \
  726.                 keying information - packet type 1 );
  727.     ioctlWrite( driveNumber, PACKET_SET_MOUNTSTATUS, \
  728.                 mount status TRUE - packet type 4 );
  729.  
  730. To unmount a volume, erasing the keying information held by the device driver:
  731.  
  732.     driveNumber <- find SFS drive number as outlined above;
  733.     ioctlWrite( driverNumber, PACKET_SET_MOUNTSTATUS, \
  734.                 mount status FALSE - packet type 4 );
  735.  
  736.  
  737. Interfacing with mountsfs
  738. -------------------------
  739.  
  740. In order to facilitate the use of SFS with other software such as graphical
  741. front-ends, mountsfs can be run in batch mode in which it accepts abbreviated
  742. forms of the usual commands and outputs more complex results to fixed-record
  743. data files instead of the screen.
  744.  
  745.  
  746. Controlling mountsfs in Batch Mode
  747.  
  748. In order to enable these features, the first option given to mountsfs must be
  749. the keyword `batch'.  This allows it to recognise alternative single-letter
  750. forms of the normal commands.  These single-letter options and their equivalent
  751. commands are as follows:
  752.  
  753.     Letter      Full command
  754.  
  755.       f         user file
  756.       h         hotkey
  757.       i         info or informaion
  758.       n         user name
  759.       p         password entry
  760.       s         status
  761.       t         timeout
  762.       u         unmount
  763.       v         volume name
  764.  
  765. The volume name, hotkey, timeout, user name, and user file options must be
  766. followed by the appropriate extra information in the usual format.  The
  767. password entry option should be followed by the password for the encrypted
  768. volume.  For example to mount the volume "Test" with a quick-unmount hotkey of
  769. Ctrl-Alt-Z, an auto-unmount timeout of 10 minutes, and a password of "secret
  770. data" the command would be:
  771.  
  772.     mountsfs batch vTest hCtrlAltZ t10 "psecret data"
  773.  
  774. which is equivalent to the usual:
  775.  
  776.     mountsfs vol=test hotkey=ctrlAltZ timeout=10
  777.  
  778.  
  779. mountsfs Output in Batch Mode
  780.  
  781. During normal operation mountsfs may print several lines of information to the
  782. screen giving details on the status of the operation being performed and
  783. details on currently mounted and unmounted SFS volumes.  When mountsfs is run
  784. in batch mode, this information is written to a fixed-record data file named
  785. "sfs.tmp" instead of to the screen.  The location of the file is given by the
  786. "TMP" environment variable; if this variable does not exist, the file is
  787. written to the root directory of the C: drive.  If the TMP environment variable
  788. points to a drive without a path, the file is written to the root directory of
  789. that drive.  Thus if the TMP environment variable were set as:
  790.  
  791.     set tmp=e:\data\
  792.  
  793. then mountsfs would output the results of the status or info/information
  794. command to the file "e:\data\sfs.tmp".  If the variable were set as:
  795.  
  796.     set tmp=a:
  797.  
  798. then mountsfs would output its data to the file "a:\sfs.tmp".
  799.  
  800. The mountsfs output is written to the file as a series of fixed records.  Each
  801. record is in ASCII text format with individual fields beginning on new lines,
  802. making parsing by external software a simple task.  All control fields are in
  803. uppercase text.  The exact record format is determined by the record type which
  804. is specified in the first line.  In most cases the only record written will be
  805. the result from the mountsfs execution, although the status and
  806. info/information commands produce one or more extra output records which are
  807. detailed in the section "The status and info Commands in Batch Mode" below.
  808.  
  809. The mountsfs result record is laid out as follows:
  810.  
  811.     Field               Field contents
  812.  
  813.     Record type         "RESULT"
  814.     Success status      "TRUE" or "FALSE"
  815.     Error message       <string : error message, or empty string>
  816.  
  817. The record type field identifies the following record as being a mountsfs
  818. result record.
  819.  
  820. The success status field gives the success status of the mountsfs command.  A
  821. value of "TRUE" indicates the command succeeded, a value of "FALSE" indicates
  822. the command failed.
  823.  
  824. The error message field gives the error message generated by mountsfs if the
  825. success status field is set to FALSE, or an empty string if the success status
  826. field is set to TRUE.
  827.  
  828. A successful mountsfs command result record would be as follows:
  829.  
  830.     Field                   Field data
  831.  
  832.     Record type             RESULT
  833.     Success status          TRUE
  834.     Error message
  835.  
  836. A failed mountsfs command result record might be as follows:
  837.  
  838.     Field                   Field data
  839.  
  840.     Record type             RESULT
  841.     Success status          FALSE
  842.     Error message           Cannot find SFS driver
  843.  
  844.  
  845. The status and info Commands in Batch Mode
  846.  
  847. Apart from the result record, mountsfs produces two other types of output
  848. records, the output from a status command and the output from an info/
  849. information command.  As with the RESULT record, each record is in ASCII text
  850. format with individual fields beginning on new lines, making parsing by
  851. external software a simple task.  All control fields are in uppercase text.
  852. The exact record format is determined by the record type which is specified in
  853. the first line.  This is either "STATUS" for the output from a status command,
  854. or "INFORMATION" for the output from an info/information command.
  855.  
  856. The status command output record is laid out as follows:
  857.  
  858.     Field               Field contents
  859.  
  860.     Record type         "STATUS"
  861.     Unit number         <number : drive unit number>
  862.     Mount status        "TRUE" or "FALSE"
  863.     Volume name         <string : volume name, or empty string>
  864.     R/W access allowed  "TRUE" or "FALSE"
  865.     Drive letter        <character : uppercase driver letter>
  866.     Hotkey              <Ctrl, Alt, LeftShift, RightShift = 'c', 'a', 'l', 'r'>
  867.                         <Letter = uppercase letter. Example: Ctrl-Alt-Z = "caZ">
  868.     Timeout total time  <number : time in minutes, or "FALSE">
  869.     Timeout time left   <number : time in minutes, or "FALSE">
  870.  
  871. The record type field identifies the following record as being from the output
  872. of the status command.
  873.  
  874. The unit number field is the drive unit number used by the SFS driver.
  875.  
  876. The mount status field contains "TRUE" if there is a volume mounted, or "FALSE"
  877. if there are no volumes mounted.  If this field contains the value "FALSE" then
  878. the following fields will contain null values (either the value "FALSE" or
  879. blank fields as appropriate).
  880.  
  881. The volume name field contains the name of the volume.  This may contain any
  882. type of character, or may be an empty string if no volume name is present.
  883.  
  884. The R/W access allowed field contains "TRUE" if read/write access to the volume
  885. is allowed, or "FALSE" if write access is disabled and the volume is mounted
  886. read-only.
  887.  
  888. The drive letter field contains the uppercase drive letter which the mounted
  889. SFS volume corresponds to.
  890.  
  891. The hotkey field contains the quick-unmount hotkey value or "FALSE" if none is
  892. set.  The shift keys (if any) are given in lowercase and the ASCII key value
  893. (if any) is given in uppercase.  The shift key codes are Ctrl = 'c', Alt = 'a',
  894. leftShift = 'l', rightShift = 'r'.  These are followed by the ASCII key value,
  895. if there is one.  Thus the code for the default quick-unmount hotkey
  896. combination leftShift-rightShift would be "lr", and the code for the hotkey
  897. combaination Ctrl-Alt-Z would be "caZ".
  898.  
  899. The timeout total time and timeout time left fields contain either the
  900. auto-unmount total time in minutes and the time left before the unmount takes
  901. place in minutes, or the control string "FALSE" if no timeout is set.
  902.  
  903. A typical status command output record might be as follows:
  904.  
  905.     Field                   Field data
  906.  
  907.     Record type             STATUS
  908.     Unit number             0
  909.     Mount status            TRUE
  910.     Volume name             Encrypted data
  911.     R/W access allowed      TRUE
  912.     Drive letter            G
  913.     Hotkey                  lr
  914.     Timeout total time      15
  915.     Timeout time left       4
  916.  
  917. This would then usually be followed by a RESULT record.
  918.  
  919. The information command output record is laid out as follows:
  920.  
  921.     Field               Field contents
  922.  
  923.     Record type         "INFORMATION"
  924.     Volume name charset <string : character set name, or "FALSE">
  925.     Volume name         <string : volume name, or empty string>
  926.     Volume date         <string : date in YYMMDDHHMMSS format>
  927.     Volume ID           <number : volume serial number>
  928.     Volume size         <number : volume size in kilobytes, or "FALSE">
  929.     Filesystem type     <string : filesystem type, or "FALSE">
  930.     Automount ID        <string[8] : automount ID, or "FALSE">
  931.     Multiuser access    "TRUE" or "FALSE"
  932.     Mount status        <character : uppercase driver letter, or "FALSE">
  933.  
  934. The record type field identifies the following record as being from the output
  935. of the info/information command.
  936.  
  937. The volume name character set field contains the name of the character set used
  938. in the volume name.  This is either "ISO 646", "ISO 8859-1", "ISO 8859-2", "ISO
  939. 8859-3", "ISO 8859-4", "ISO 8859-5", "ISO 8859-6", "ISO 8859-7", "ISO 8859-8",
  940. "ISO 8859-9", or "FALSE" if the character set is unknown.
  941.  
  942. The volume name field contains the name of the volume.  This may contain any
  943. character from the character set given in the Volume name character set field,
  944. or may be an empty string if no volume name is present.
  945.  
  946. The volume date field contains the volume date in YYMMDDHHMMSS (two-digit year,
  947. month, day, hour, minute, second) format.
  948.  
  949. The volume ID field contains the volume serial number.
  950.  
  951. The volume size field contains the volume size in kilobytes, or "FALSE" if the
  952. volume is removable media.
  953.  
  954. The filesystem type field contains the name of the filesystem the volume
  955. contains.  This is either "DOS", or "FALSE" if the filesystem is unknown.
  956.  
  957. The automount ID field contains the 8-character automount ID for the volume if
  958. the volume is on a fixed disk, or "FALSE" if the volume is on a removable disk
  959. and no automount is possible.
  960.  
  961. The multiuser access field contains "TRUE" if multiuser access to the volume is
  962. possible or "FALSE" if only single-user access is possible.
  963.  
  964. The mount status field contains the uppercase drive letter which the mounted
  965. SFS volume corresponds to if the volume is mounted, or "FALSE" if it is
  966. unmounted.
  967.  
  968. The status command output records corresponding to the volumes given in the
  969. section "Mounting an SFS Volume" above would be as follows:
  970.  
  971.     Field                   Field data
  972.  
  973.     Record type             INFORMATION
  974.     Volume name charset     ISO 646
  975.     Volume name             Data backup
  976.     Volume date             931101101301
  977.     Volume ID               1234
  978.     Volume size             FALSE
  979.     Filesystem type         DOS
  980.     Automount ID            FALSE
  981.     Multiuser access        FALSE
  982.     Mount status            FALSE
  983.     Record type             INFORMATION
  984.     Volume name charset     ISO 646
  985.     Volume name             Personal financial records
  986.     Volume date             930906112219
  987.     Volume ID               177545
  988.     Volume size             10000
  989.     Filesystem type         DOS
  990.     Automount ID            03A12F7B
  991.     Multiuser access        FALSE
  992.     Mount status            E
  993.     Record type             INFORMATION
  994.     Volume name charset     ISO 646
  995.     Volume name             Encrypted data disk
  996.     Volume date             930412221700
  997.     Volume ID               69231461
  998.     Volume size             42456
  999.     Filesystem type         DOS
  1000.     Automount ID            42DD2536
  1001.     Multiuser access        TRUE
  1002.     Mount status            FALSE
  1003.  
  1004. This would then usually be followed by a RESULT record.
  1005.  
  1006. In order to make use of these records, the controlling program should invoke
  1007. mountsfs in batch mode with either the `s' status or `i' information command.
  1008. mountsfs will run and, if no errors are encountered, write its output to the
  1009. output file.  The controlling program can then read the data from the file,
  1010. delete the file, and handle the information as appropriate.
  1011.  
  1012.  
  1013. Selected Source Code
  1014. --------------------
  1015.  
  1016. This section contains a walkthrough of selected portions of the source code
  1017. (mainly the encryption-related parts) to allow the verification of its
  1018. correctness and to help people wishing to write SFS-compatible software.
  1019.  
  1020. [!!!! Not in the beta release to save space and because I haven't had
  1021.       time to add it yet, should be in a later final version !!!!]
  1022.  
  1023.  
  1024. Future Work
  1025. -----------
  1026.  
  1027. The following ideas may be incorporated into future versions of SFS if
  1028. requested by users.  In addition reasonable requests for other improvements may
  1029. also find their way into SFS.
  1030.  
  1031.  - Improve error recovery for the encryption process.  This is somewhat
  1032.    difficult, and will probably involve keeping a copy of status information
  1033.    and the track currently being encrypted on a local volume to allow a restart
  1034.    in the case of a power failure.  There are problems inherent in this as it
  1035.    involves storing sensitive data in a disk file, and will slow down the
  1036.    processing considerably due to the need to write each track to two
  1037.    physically separate disk volumes instead of one continuous one.  A partial
  1038.    solution is to keep the status information (simply an index of the disk
  1039.    section currently being encrypted) in the volume header while mksfs is
  1040.    running and provide some sort of restart option if power is lost, although
  1041.    what happens if power dies halfway through writing a track is uncertain.
  1042.  
  1043.  - A plug-in card which contains a BIOS extension which hooks int 13h and
  1044.    encrypts and entire physical disk (not just one disk volume), from the
  1045.    master boot record at the start to the very last sector at the end.  This
  1046.    means all disk I/O must be done via int 13h and won't work on all systems.
  1047.    Cost for the card is estimated to be about $80-$100 for the basic version an
  1048.    up to $200 for the full hardware version whose throughput it significantly
  1049.    higher than the basic version.
  1050.  
  1051.  
  1052. Recommended Reading
  1053. -------------------
  1054.  
  1055. In recent years a large number of books and articles on crytography have
  1056. appeared.  Many of these are beyond the level of anyone with a casual interest
  1057. in the subject, but a good overview is given by Dorothy Dennings (now somewhat
  1058. dated) "Cryptography and Data Security", published by Addison-Wesley in 1982
  1059. (ISBN 0-201-10150-5).  Bruce Schneier's much more recent "Applied
  1060. Cryptography", published by John Wiley and Sons in 1993 (ISBN 0-471-59756-2),
  1061. is probably the best single text on cryptography currently available, and is
  1062. recommended reading for anyone wanting more information on the principles
  1063. behind SFS.  This book also contains a large list of references to more
  1064. information on all manner of encryption algorithms, protocols, and technology.
  1065. Voydock and Kent's tutorial "Security Mechanisms in High-Level Network
  1066. Procotols", published in the ACM Computing Surveys Vol.15, No.2 (June 1983)
  1067. provides a good overview of design considerations for encryption systems.
  1068.  
  1069. The algorithms and techniques used in SFS are laid down in the following
  1070. national and international standards:
  1071.  
  1072.     ANSI X3.106, "American National Standard for Information Systems - Data
  1073.         Encryption Algorithm - Modes of Operation"
  1074.  
  1075.     Australian Standard AS 2805.5.2, "Electronic Funds Transfer - Requirements
  1076.         for Interface", Part 5.2, "Ciphers - Modes of operation for an n-bit
  1077.         block cipher algorithm"
  1078.  
  1079.     ISO 10116:1991, "Information technology - Modes of operation for an n-bit
  1080.         block cipher algorithm"
  1081.  
  1082.     ISO 10126-2:1991, "Banking - Procedures for message encipherment
  1083.         (wholesale) - DEA Algorithm"
  1084.  
  1085.     NBS FIPS pub. 81, "DES Modes of Operation", 1980
  1086.  
  1087.     NIST FIPS pub. 180, "Secure Hash Standard", 1993
  1088.  
  1089. Information on the weaknesses of some cryptosystems are published in a variety
  1090. of places.  The largest publicly available sources of information are the
  1091. cryptography conference proceedings which are part of the Springer-Verlag
  1092. "Lecture Notes in Computer Science" series.  Eli Biham and Adi Shamir's
  1093. "Differential Cryptanalysis of the Data Encryption Standard", also published by
  1094. Springer-Verlag (ISBN 0-387-97930-1), gives information on the resistance to
  1095. attack of a number of block ciphers.
  1096.  
  1097. Finally, James Bamford's "The Puzzle Palace", published by Houghton-Mifflin in
  1098. 1982, is a good source of information on the operation of the NSA, albeit
  1099. slightly dated (it predates the widespread availability of encryption for
  1100. personal computers, for example).
  1101.  
  1102. This list only scratches the surface of the full range of cryptographic and
  1103. security literature available - a very detailed bibliography can be found in
  1104. the "Applied Cryptography" book.
  1105.  
  1106.  
  1107. Using SFS
  1108. ---------
  1109.  
  1110. In general SFS is free for personal (private) use.  However if you find SFS of
  1111. use then in order to allow continued development of and enhancements to SFS, in
  1112. particular the creation of more user-friendly versions of mksfs and mountsfs,
  1113. of versions for other systems, of a low-cost plug-in card containing whole-disk
  1114. encryption firmware, and the replacement of the drive I fried testing SFS, a
  1115. donation of $25 would be appreciated.  Alternatively, the donation can be used
  1116. to cover the legal costs of those people involved in the current US government
  1117. investigation of the PGP encryption program.
  1118.  
  1119. Use of SFS in a commercial, government, or institutional environment or for
  1120. business purposes is allowed for free for 30 days to allow it to be evaluated.
  1121. After this period it should be registered for further use.  The registration
  1122. fee covers use of SFS on any one machine at any one time (so you could, for
  1123. example, use SFS on a machine at work and keep a copy on your notebook PC for
  1124. use while travelling).
  1125.  
  1126. If you decide to send a donation or registration, please specify whether you'd
  1127. like it to be used for further SFS development work or if it is to go into the
  1128. PGP legal fund.  Cheques or money orders can be sent to:
  1129.  
  1130.         Peter Gutmann
  1131.         24 Durness Pl.
  1132.         Orewa
  1133.         Auckland
  1134.         New Zealand
  1135.  
  1136. I can also be contacted through email at (among others) the following
  1137. addresses:
  1138.  
  1139.         pgut1@cs.aukuni.ac.nz
  1140.         p.gutmann@cs.auckland.ac.nz
  1141.         peterg@kcbbs.gen.nz
  1142.  
  1143. with the first address being the preferred one.  Finally, the fastest way to
  1144. contact me is by phone between about 10am and 1am at the following number
  1145. (remembering that NZ local time is GMT+13, so we're usually about 18-20 hours
  1146. ahead of the US and about 12 hours ahead of Europe):
  1147.  
  1148.         +64 9 426-5097
  1149.  
  1150.  
  1151. Testimony from one of our satisfied customers:
  1152.  
  1153.  "I hear this crash and I find a rock, wrapped in paper, next to my living room
  1154.   window.  I open up the note and it says `You want it in writing? You got it.
  1155.   Next time, use a *real* encryption program.  SFS.  We know where you live'".
  1156.  
  1157.   So why aren't *you* using SFS?
  1158.  
  1159. Here's what reviewers have been saying about SFS:
  1160.  
  1161.  "Version 1.0 has several of the advanced features recommended in version 0.9,
  1162.   but not all of the ones I'd like to see in version 1.1.  So, it's pretty good
  1163.   except when it's not.  Three stars.
  1164.  
  1165.   You probably won't use half the features anyway.  I'm a little ticked off
  1166.   that it clashes with my most exotic memory-resident programs, but otherwise
  1167.   the software runs just fine on my Turbo Rambuster 586.  It will probably run
  1168.   like molasses on your 386SX.
  1169.  
  1170.   It's great value at $25, and I recommend you register it, although that's
  1171.   easy for me to say because reviewers get freebies".
  1172.  
  1173.  
  1174. Credits
  1175. -------
  1176.  
  1177. Thanks to the readers of comp.os.msdos.programmer and comp.os.linux.development
  1178. and in particular Jouni Kosonen, for their valuable advice with low-level DOS
  1179. disk handling and organization, and the users of the Enigma BBS, in particular
  1180. Arne Rohde, for helping test-run several early versions of the low-level disk
  1181. handling code on various drive configurations and for providing useful advice
  1182. on the vagaries of the PC's disk handling.   Thanks also to Steven Altchuler
  1183. for performing all sorts of dangerous tests on SFS volumes, and to Vadim Vlasov
  1184. for help with various thorny problems with low-level disk and device driver
  1185. programming.
  1186.  
  1187. Matthias Bruestle (the greatest chemist of all time and space) provided
  1188. valuable feedback on assorted problems in mksfs and mountsfs, and risked his
  1189. disk drives testing the SFS driver and other SFS software.  At the behest of
  1190. the author he also risked imprisonment for Datenvergewaltigung by letting mksfs
  1191. near his Linux partition.
  1192.  
  1193. Colin Plumb made noises about various problems with CFB-mode encryption,
  1194. corrected me when I tried to explain the need for encrypted IV's in email at
  1195. 3am, and provided much useful feedback on SFS's operation in general, including
  1196. the very elegant solution to the CFB-mode encryption problem and help with the
  1197. disk overwriting method.
  1198.  
  1199. Vesselin Bontchev sent in long lists of suggested improvements to SFS, and
  1200. provided an ongoing commentary on features and ideas for the software (it seems
  1201. half the functionality provided by SFS is due to his suggestions).  Ralf
  1202. Brown's interrupt list provided help with the haze of obscure interrupts used
  1203. by mksfs in its quest for random information.
  1204.  
  1205. The Beerdigungsinstitut Utzmann (erstes Erlanger Beerdigungsunternehmen) helped
  1206. clean up the casualties from the SFS beta-testing.  Finally, Tony, Geezer,
  1207. Bill, Ozzy, Ron, and Grandos helped me stay awake during many long nights of
  1208. debugging low-level disk access code and encryption routines.
  1209.  
  1210. Various other people have at various times offered help and suggestions on
  1211. getting SFS going.  My thanks go to them also.
  1212.  
  1213.  
  1214. Warranty
  1215. --------
  1216.  
  1217. 1. Customer Obligations
  1218.  
  1219. 1.1. Customer assumes full responsibility that this program meets the
  1220.      specifications, capacity, capabilities, and other requirements of said
  1221.      customer, and agrees not to bother the author if the program does not
  1222.      perform as expected, or performs other than expected, or does not perform
  1223.      at all.
  1224.  
  1225. 1.2. Customer assumes full responsibility for any deaths or injuries that may
  1226.      result from the normal or abnormal operation of this program.  In the
  1227.      event of casualties exceeding 1000 persons or property damage in excess of
  1228.      $10 million, customer agrees that he or she has stolen the program and we
  1229.      didn't even know he or she had it.
  1230.  
  1231. 1.3. Customer agrees not to say bad things about the program or the author to
  1232.      anyone claiming to be from "60 Minutes".
  1233.  
  1234.  
  1235. 2. Very Limited Warranty and Conditions of Sale
  1236.  
  1237. 2.1. For a period of 90 minutes, commencing from the time you first thought
  1238.      about getting this program, we warrant that this program may or may not be
  1239.      free of any manufacturing defects.  It will be replaced during the
  1240.      warranty period upon payment of an amount equal to the original purchase
  1241.      price plus $10.00 for handling.  This warranty is void if the program has
  1242.      been examined or run by the user, or if the manual has been read.
  1243.  
  1244. 2.2. This program is sold on an AS WAS basis.  The author makes no warranty
  1245.      that it is, in fact, what we say it is in our propaganda, or that it will
  1246.      perform any useful function.  We have no obligation whatsoever other than
  1247.      to provide you with this fine disclaimer.
  1248.  
  1249. 2.3. Some countries do not allow limitations as to how long an implied warranty
  1250.      lasts, so we refuse to imply anything.
  1251.  
  1252. 2.4. There is an extremely small but nonzero chance that, through a process
  1253.      known as "tunnelling", this program may spontaneously disappear from its
  1254.      present location and reappear at any random place in the universe,
  1255.      including your neighbours computer system.  The author will not be
  1256.      responsible for any damages or inconvenience that may result.
  1257.  
  1258.  
  1259. 3. Limitation of Liability
  1260.  
  1261. 3.1. We have no liability or responsibility to the customer, the customers
  1262.      agents, our creditors, your creditors, or anyone else. 
  1263.